﻿#include <iostream>
#include <opencv2/opencv.hpp>
#include <filesystem>
using namespace cv::dnn;

using namespace cv;
using namespace std;
namespace fs = std::filesystem;

int main()
{
	/*
	模块名称		主要功能																			常用类 / 函数
	Core			提供基本数据结构和函数，如图像存储、矩阵操作、文件 I / O 等。						Mat, Point, Size, Rect, Scalar, FileStorage, cv::format
	Imgproc			图像处理功能，包括滤波、几何变换、颜色空间转换、边缘检测、形态学操作、阈值化等。	cvtColor, GaussianBlur, Canny, threshold, resize, warpAffine
	Highgui			图像和视频的显示、窗口管理、用户交互（如鼠标事件、滑动条）。						imshow, namedWindow, waitKey, createTrackbar, setMouseCallback
	Video			视频处理功能，包括视频捕获、背景减除、光流计算等。									VideoCapture, VideoWriter, BackgroundSubtractor, calcOpticalFlowPyrLK
	Calib3d			相机标定、3D 重建、姿态估计等。														findChessboardCorners, calibrateCamera, solvePnP, recoverPose
	Features2d		特征检测与描述，包括关键点检测、特征匹配等。										ORB, SIFT, SURF, BFMatcher, FlannBasedMatcher
	Objdetect		目标检测功能，如 Haar 级联检测、HOG 检测等。										CascadeClassifier, HOGDescriptor
	DNN				深度学习模型的加载和推理，支持 TensorFlow、PyTorch、Caffe 等框架。					readNet, blobFromImage, Net::forward
	ML				机器学习算法，如 KNN、SVM、决策树等。												KNearest, SVM, DTrees, TrainData
	Flann			快速近似最近邻搜索（FLANN），用于特征匹配和高维数据搜索。							Index, KDTreeIndexParams, SearchParams
	Photo			图像修复、去噪、HDR 成像等。														inpaint, fastNlMeansDenoising, createTonemap
	Stitching		图像拼接功能，用于创建全景图。														Stitcher, Stitcher::create
	Shape			形状分析和匹配。																	ShapeDistanceExtractor, ShapeContextDistanceExtractor
	Tracking		目标跟踪算法，如 MIL、KCF、GOTURN 等。												TrackerMIL, TrackerKCF, TrackerGOTURN
	Videoio			视频输入输出功能，支持多种视频格式和摄像头。										VideoCapture, VideoWriter, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT
	Imgcodecs		图像文件的读取和保存，支持多种图像格式。											imread, imwrite, imdecode, imencode
	Xfeatures2d		额外的特征检测与描述算法，如 SIFT、SURF、FREAK 等。									SIFT, SURF, FREAK, DAISY
	Superres		超分辨率图像处理。																	SuperResolution, DenseOpticalFlowExt
	Optflow			光流计算和运动分析。																calcOpticalFlowFarneback, calcOpticalFlowPyrLK
	Cuda			利用 GPU 加速的计算机视觉算法。														cuda::GpuMat, cuda::Stream, cuda::resize
	Contrib			社区贡献的额外功能，如人脸识别、文本检测等。										FaceRecognizer, TextDetector
	*/




	// 创建一个 3x3 的矩阵
	Mat mat = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);

	// 输出矩阵
	cout << "Matrix:\n" << mat << endl;

	// 访问矩阵元素
	int value = mat.at<int>(1, 1);
	cout << "Value at (1, 1): " << value << endl;



	// 获取当前可执行文件的路径
	fs::path exePath = fs::current_path();
	// 构建资源文件的完整路径
	fs::path imagePath = exePath / "x64\\Debug\\img\\C++.png";
	string imgPath_str = imagePath.generic_string();

	//OpenCV（Open Source Computer Vision Library）是一个开源的计算机视觉和机器学习软件库

	//加载图片: 图片路径、读取图像的方式
	Mat image = imread(imgPath_str, IMREAD_COLOR);
	//可调整窗体大小
	//namedWindow("图片显示窗口", WINDOW_FREERATIO);

	if (image.empty())
	{
		cout << "没有图像\n";
		return -1;
	}
	//显示图像
	imshow("原图片窗口", image);






	// 打开摄像头
	//VideoCapture cap(0);
	//if (!cap.isOpened()) return -1;

	//Mat frame;
	//while (true) {
	//	// 读取一帧
	//	cap >> frame;
	//	if (frame.empty()) break;

	//	// 显示帧
	//	imshow("Camera Feed", frame);

	//	// 按下 ESC 键退出
	//	if (waitKey(30) == 27) break;
	//}

	//// 释放摄像头并关闭窗口
	//cap.release();
	//destroyAllWindows();





	  // 读取图像
	Mat image1 = imread(imgPath_str);
	Mat image2 = imread(imgPath_str);
	if (image1.empty() || image2.empty()) return -1;

	// 特征点检测与匹配
	Ptr<Feature2D> detector = ORB::create();
	vector<KeyPoint> keypoints1, keypoints2;
	Mat descriptors1, descriptors2;
	detector->detectAndCompute(image1, noArray(), keypoints1, descriptors1);
	detector->detectAndCompute(image2, noArray(), keypoints2, descriptors2);

	BFMatcher matcher(NORM_HAMMING);
	vector<DMatch> matches;
	matcher.match(descriptors1, descriptors2, matches);

	// 计算基础矩阵
	vector<Point2f> points1, points2;
	for (const auto& match : matches) {
		points1.push_back(keypoints1[match.queryIdx].pt);
		points2.push_back(keypoints2[match.trainIdx].pt);
	}
	Mat fundamentalMatrix = findFundamentalMat(points1, points2, FM_RANSAC);

	// 输出基础矩阵
	cout << "Fundamental Matrix:\n" << fundamentalMatrix << endl;



	//// 加载模型
	//Net net = readNetFromTensorflow("model.pb", "config.pbtxt");
	//// 预处理
	//Mat blob = blobFromImage(image, 1.0, Size(300, 300), Scalar(127.5, 127.5, 127.5), true, false);
	//net.setInput(blob);
	//// 推理
	//Mat output = net.forward();
	//// 处理输出
	










	waitKey();
	return 0;
}